package com.itheima.health.service.impl;


import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.RoleDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.pojo.Role;
import com.itheima.health.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


@Service(interfaceClass = RoleService.class )
@Transactional
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;


    //查询所有角色
    @Override
    public List<Role> findAll() {
        return roleDao.findAll();
    }

    //分页查询
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        // 使用分页插件PageHelper，设置当前页，每页最多显示的记录数
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        // 响应分页插件的Page对象
        Page<Role> page = roleDao.findPage(queryPageBean.getQueryString());

        return new PageResult(page.getTotal(), page.getResult());
    }

    //新增角色
    @Override
    public void add(Role role, Integer[] permissionIds, Integer[] menuIds) {

        roleDao.add(role);

        //设置角色和权限的中间表
        setPermissionAndRole(role.getId(), permissionIds);

        //设置角色和菜单的中间表
        setMenuAndRole(role.getId(), menuIds);
    }

    //编辑角色菜单，数据回显
    @Override
    public Role findByRoleId(Integer id) {
        return roleDao.findByRoleId(id);
    }

    //根据角色id查询该角色所拥有的所有权限id
    @Override
    public List<Integer> findPermissionIdsByRoleId(Integer id) {
        return roleDao.findPermissionIdsByRoleId(id);
    }

    //根据角色id查询该角色所拥有的所有菜单id
    @Override
    public List<Integer> findMenuIdsByRoleId(Integer id) {
        return roleDao.findMenuIdsByRoleId(id);
    }

    //编辑角色
    @Override
    public void editRole(Role role, Integer[] permissionIds, Integer[] menuIds) {
        //1更新角色信息
        roleDao.editRole(role);
        //2、对于中间表：先删除后增加
        //2.1根据角色id删除权限和角色中间表数据（清理原有关联关系）
        roleDao.deleteAssociationPermissionAndRole(role.getId());
        //设置用户和角色的中间表
        setPermissionAndRole(role.getId(), permissionIds);

        //2.2根据角色id删除菜单和角色中间表数据（清理原有关联关系）
        roleDao.deleteAssociationMenuAndRole(role.getId());
        //设置用户和角色的中间表
        setMenuAndRole(role.getId(), menuIds);

    }

    //删除角色信息
    @Override
    public void deleteRole(Integer RoleId) {
       /* //判断角色和权限表、角色和菜单表是否存在关联
        long countPermissionAndRole = roleDao.countPermissionAndRole(RoleId);
        long countMenuAndRole = roleDao.countMenuAndRole(RoleId);
        if (countPermissionAndRole > 0 || countMenuAndRole > 0) {//有关系，不能删除
            throw new RuntimeException("当前角色和权限（菜单）存在关联，不能删除");
        }
        roleDao.deleteRole(RoleId);*/

        //首先查询判断当前角色与用户表是否有关联
        long count = roleDao.findCountByRoleId(RoleId);
        if (count > 0) {
            //有关联，提示不能删除
            throw new RuntimeException("当前角色已与用户绑定，不能删除");
        }
        //无关联，执行删除：首先删除与菜单的中间表，与权限的中间表，再删除role表中的数据
        //删除与菜单中间表的数据
        roleDao.deleteAssociationMenuAndRole(RoleId);
        //删除与权限中间表的数据
        roleDao.deleteAssociationPermissionAndRole(RoleId);
        //删除角色表的数据
        roleDao.deleteRole(RoleId);
    }


    //设置菜单和角色的关联关系，向中间表中添加数据
    private void setMenuAndRole(Integer roleId, Integer[] menuIds) {
        if (menuIds != null && menuIds.length > 0) {
            for (Integer menuId : menuIds) {
                roleDao.setMenuAndRole(roleId, menuId);
            }
        }
    }

    //设置权限和角色的关联关系，向中间表中添加数据
    private void setPermissionAndRole(Integer roleId, Integer[] permissionIdsIds) {
        if (permissionIdsIds != null && permissionIdsIds.length > 0) {
            for (Integer permissionId : permissionIdsIds) {
                roleDao.setPermissionAndRole(roleId, permissionId);
            }
        }
    }
}
